#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=1e6+6,V=1e6;
int n,m,C;
int a[Maxn],b[Maxn];

struct TREE{
	int l,r;
	ll sm,tag,val;
}t[Maxn<<1];

void build(int u,int l,int r){
	t[u].l=l, t[u].r=r;
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(u<<1,l,mid), build(u<<1|1,mid+1,r);
}

inline void spd1(int u){
	t[u].tag=1; t[u].sm=0;
}
inline void spd2(int u,ll v){
	t[u].val+=v; t[u].sm+=(t[u].r-t[u].l+1)*1ll*v;
}
inline void psd(int u){
	if(t[u].tag){
		spd1(u<<1);
		spd1(u<<1|1);
		t[u].tag=0;
	}
	if(t[u].val!=0){
		spd2(u<<1,t[u].val);
		spd2(u<<1|1,t[u].val);
		t[u].val=0;
	}
}
inline void psu(int u){
	t[u].sm=t[u<<1].sm+t[u<<1|1].sm;
}

void modify(int u,int l,int r){
	if(l>r) return ;
	if(t[u].l>=l and t[u].r<=r){
		spd1(u); return ;
	}
	psd(u);
	int mid=(t[u].l+t[u].r)>>1;
	if(l<=mid) modify(u<<1,l,r);
	if(r>mid) modify(u<<1|1,mid+1,r);
	psu(u);
}
void modify2(int u,int l,int r,ll v){
	if(l>r) return ;
	if(t[u].l>=l and t[u].r<=r){
		spd2(u,v); return ;
	}
	psd(u);
	int mid=(t[u].l+t[u].r)>>1;
	if(l<=mid) modify2(u<<1,l,r,v);
	if(r>mid) modify2(u<<1|1,l,r,v);
	psu(u);
}
void add(int u,int x,int v){
	if(t[u].l==t[u].r){
		t[u].sm+=v;
		return ;
	}
	psd(u);
	int mid=(t[u].l+t[u].r)>>1;
	if(x<=mid) add(u<<1,x,v);
	else add(u<<1|1,x,v);
	psu(u);
}
ll querysm(int u,int x){
	if(t[u].r<=x) return t[u].sm;
	int mid=(t[u].l+t[u].r)>>1;
	psd(u);
	if(x<=mid) return querysm(u<<1,x);
	else return querysm(u<<1,x)+querysm(u<<1|1,x);
}
int queryef(int u,ll x){
	if(t[u].l==t[u].r) return t[u].l;
	if(t[u<<1].sm>x) return queryef(u<<1,x);
	else return queryef(u<<1|1,x-t[u<<1].sm);
}

int main(){
	freopen("minimize3.in","r",stdin);
//	freopen("minimize.out","w",stdout); 

	scanf("%d%d",&n,&C);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	
	build(1,0,V);
	
	for(int i=1;i<=n;i++){
		ll o=querysm(1,a[i]);
		int lst=queryef(1,o-C);
		ll o3=querysm(1,0);
		if(o3+C<=o) add(1,0,C); else lst=-1;
		ll o2=0;
		if(lst>=0) o2=querysm(1,lst);
		modify(1,lst+1,a[i]); 
		add(1,lst+1,o-o2); 
		modify2(1,a[i]+1,V,1);
	}
	printf("%lld",querysm(1,0));
	
	return 0;
}
/*
3 3
4 5 2

10 5
12 17 20 2 0 1 13 6 10 1
*/
